package Shifu.MainServer.Net;

import java.io.*;
import java.net.*;
import java.rmi.*;
import java.rmi.activation.*;
import java.rmi.registry.*;
import java.rmi.server.*;
import java.util.Properties;
import Shifu.Login.LoginInterface;
import java.rmi.MarshalledObject;
import java.rmi.registry.*;


/**
 * Esegue il Setup dei Server e del
 * sistema di attivazione
 */

public class Setup {

	public static void main(String args[]) {

		System.out.println("Avvio Setup di Shifu !");
		String policyGroup = System.getProperty("datetime.policy");
		String hostname = System.getProperty("java.rmi.server.hostname");
		System.out.println(hostname);
		//String implCodebase = System.getProperty("datetime.impl.codebase");
		//String classeserver = System.getProperty("datetime.classeserver");
		String implCodebase = "http://192.168.1.8:80/codebase/";
		String classservermainserver = "Shifu.MainServer.Net.MainServer";
		String classserverloginserver = "Shifu.Login.LoginServerImpl";

		System.setSecurityManager(new RMISecurityManager());

		try {

			//Properties per mainServer
			Properties propmain = new Properties();
			propmain.put("java.security.policy",policyGroup);
			propmain.put("datetime.impl.codebase", implCodebase);
			propmain.put("java.rmi.server.hostname",hostname);
			propmain.put("java.class.path", "/usr/share/java/postgresql-jdbc3.jar");

			//Properties per serverdiLoginr
			Properties proplogin = new Properties();
			proplogin.put("java.security.policy",policyGroup);
			proplogin.put("datetime.impl.codebase", implCodebase);
			proplogin.put("java.rmi.server.hostname",hostname);
			proplogin.put("java.class.path", "/usr/share/java/postgresql-jdbc3.jar");
       			proplogin.put("javax.net.ssl.keyStore", System.getProperty("javax.net.ssl.keyStore"));
        		proplogin.put("javax.net.ssl.keyStorePassword", System.getProperty("javax.net.ssl.keyStorePassword"));


			//SETUP PER IL MAINSERVER

			System.out.println("Setup del MainServe!");
			//Gruppo di attivazione per il MainServer
			ActivationGroupDesc groupDescMainServer = new ActivationGroupDesc(propmain,null);
			//Registrazione del gruppo di attivazione
			ActivationGroupID groupIDMainServer = ActivationGroup.getSystem().registerGroup(groupDescMainServer);
			//Creazione activationDescriptor con le informazioni sul server
			ActivationDesc actDescMainServer = new ActivationDesc(groupIDMainServer, classservermainserver, implCodebase, null);
			//Registrazione del server con il sistema di attivazione
			Seeder stub_mainserver = (Seeder) Activatable.register(actDescMainServer);

			System.out.println("E' stato creato l'activation descriptor del server che e' stato registrato col demone d'attivazione");
			System.out.println("Il server attivabile che adesso puo' essere acceduto attraverso lo stub: "+stub_mainserver);

			//SETUP PER IL SERVER DI LOGIN

			System.out.println("Setup del LoginServer!");
			//Gruppo di attivazione per il Server di Login			
			ActivationGroupDesc groupDescLoginServer = new ActivationGroupDesc(proplogin,null);
			//Registrazione del gruppo di attivazione
			ActivationGroupID groupIDLoginServer = ActivationGroup.getSystem().registerGroup(groupDescLoginServer);
			//Costruzione del MarshalledObject con lo stub del mainServer
			MarshalledObject stubmainserver = new MarshalledObject(stub_mainserver);
			//Creazione activationDescriptor con le informazioni sul server
			ActivationDesc actDescLoginServer = new ActivationDesc(groupIDLoginServer,classserverloginserver,implCodebase,stubmainserver);
			//Registrazione del server con il sistema di attivazione
			LoginInterface stub_loginserver = (LoginInterface) Activatable.register(actDescLoginServer);

			System.out.println("E' stato creato l'activation descriptor del server che e' stato registrato col demone d'attivazione");
			System.out.println("Il server attivabile che adesso puo' essere acceduto attraverso lo stub: "+stub_loginserver);

			System.out.println("I gruppi di attivazione sono stati generati, il MainServer ha id:"+groupIDMainServer+" e il LoginServer id:"+groupIDLoginServer);
			System.out.println("Bind del server di login al Registro Rmi creato dal demone RMID sulla porta 1098");
			Naming.rebind("//:1098/Login", stub_loginserver);
			System.exit(0);	

		} catch (Throwable t){
			t.printStackTrace();
		}
	}

}
